package core

import (
	"buding-ai/internal/repository/model"
	"buding-ai/pkg/config"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
)

var (
	DB     *gorm.DB
	Logger *log.Logger
)

func init() {
	// 初始化日志
	Logger = log.New(os.Stdout, "[DB] ", log.LstdFlags)

	// 获取数据库配置
	database := config.GetConfig().Database

	// 构建连接字符串
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		database.User,
		database.Password,
		database.Host,
		database.Port,
		database.DBName)

	// 配置GORM日志
	gormLogger := logger.New(
		Logger,
		logger.Config{
			SlowThreshold: 200 * time.Millisecond, // 慢查询阈值
			LogLevel:      logger.Info,            // 日志级别
			Colorful:      true,                   // 彩色打印
		},
	)

	// 初始化数据库连接
	var err error
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger:                                   gormLogger,
		SkipDefaultTransaction:                   true, // 跳过默认事务
		PrepareStmt:                              true, // 缓存预编译语句
		DisableForeignKeyConstraintWhenMigrating: true, // 禁用外键约束
	})

	if err != nil {
		Logger.Fatalf("数据库连接失败: %s", err.Error())
	}

	// 配置连接池
	sqlDB, err := DB.DB()
	if err != nil {
		Logger.Fatalf("获取DB实例失败: %s", err.Error())
	}

	// 设置连接池参数
	sqlDB.SetMaxIdleConns(10)                  // 最大空闲连接数
	sqlDB.SetMaxOpenConns(100)                 // 最大打开连接数
	sqlDB.SetConnMaxLifetime(time.Hour)        // 连接最大生命周期
	sqlDB.SetConnMaxIdleTime(30 * time.Minute) // 空闲连接最大生命周期

	Logger.Println("数据库连接成功")

	// 自动迁移表结构 (排除Message，因为它是MongoDB的模型)
	err = DB.AutoMigrate(
		&model.Chat{},
		&model.Knowledge{},
		&model.User{},
		&model.Mcp{},
		&model.AgentRole{},
		&model.AgentModelProvider{},
		// Message结构体是为MongoDB设计的，不应该迁移到MySQL
		// &domain.Message{}, // 已移除
	)

	if err != nil {
		Logger.Fatalf("数据库迁移失败: %s", err.Error())
	}

	Logger.Println("数据库表结构迁移完成")
}
